第6.4节 词云图
各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。
本期推送内容目录如下,如果本期内容对你有所帮助,欢迎点赞、转发支持掌柜!
6.4 词云图 6.4.1 生成词云图 6.4.2 自定义样式 6.4.3 小结
6.4 词云图
在介绍完文本的向量化表示方法后,这里再顺便介绍一个实用的对文本按权重(频率)进行可视化的Python包word cloud。根据word cloud,可以将词语以权重大小或者词频高低来生成词云图,如图6-3所示。
图6-3所展示的词云图是根据宋词分词统计后所形成的结果,其中字体越大表示其出现的频率越高或者TFIDF权重越大。
6.4.1 生成词云图
在生成词云图之前,首先需要统计词频或者TFIDF权重。接下来,以一个宋词数据集为例进行介绍。完整代码见Book/Chapter06/06_word_cloud.py
文件。
1. 载入原始文本
首先需要载入原始的宋词数据,代码如下:
def load_data_and_cut(file_path='./data/QuanSongCi.txt'):
cut_words = ""
with open(file_path, encoding='utf-8') as f:
for line in f:
line = line.strip('\n')
if len(line) < 20:
continue
seg_list = jieba.cut(clean_str(line), cut_all=False)
cut_words += (" ".join(seg_list))
all_words = cut_words.split()
return all_words
可以看到,上述代码和6.1.3节中的代码基本一样,所以在此就不再赘述了。
2. 统计词频
接下来,通过Counter
计数器来完成分词结果中词频的统计,代码如下:
def get_words_freq(all_words, top_k=500):
c = Counter()
for x in all_words:
if len(x) > 1 and x != '\r\n':
c[x] += 1
vocab = {}
for (k, v) in c.most_common(top_k):
vocab[k] = v
return vocab
在上述代码中,第2行用来定义一个计数器,第5行用来对每个词进行计数,第6~8行用来查找出现频率最高的前top_k
个词,并将词和出现频率以字典的形式进行存储。
3. 生成词云图
在得到词频字典后,便可以通过WordCloud
类来完成词云图的生成,代码如下:
def show_word_cloud(word_fre):
word_cloud = WordCloud(font_path='./data/simhei.ttf',
background_color='white', max_font_size=70)
word_cloud.fit_words(word_fre)
plt.imshow(word_cloud)
plt.xticks([]) # 去掉横坐标
plt.yticks([]) # 去掉纵坐标
plt.tight_layout()
plt.show()
在上述代码中,第2行用来载入汉字字体,因为word cloud默认不支持汉字,第4行用来生成词云图,第5~6行用来展示最后生成的词云图。在运行完上述代码后,便可以得到如图6-3所示的词云图。可以发现,全词中出现频率最高的几个词便是“人间”、“东风”、“何处”、“风流”等。
6.4.2 自定义样式
通过word cloud除了能够生成类似图6-3所示的矩形词云图以外,更多场景下我们希望能够生成自定义样式的词云图。例如一个人的形状、一个建筑的形状等。在word cloud中,只需要在实例化对象WordCloud
时传入一个掩码矩阵便可完成这一想法。完整代码见Book/Chapter06/07_word_cloud.py
文件,代码如下:
def show_word_cloud(word_fre):
from PIL import Image
img = Image.open('./data/dufu.png')
img_array = np.array(img)
word_cloud = WordCloud(font_path='./data/simhei.ttf',
background_color='white', max_font_size=70, mask=img_array)
word_cloud.fit_words(word_fre)
plt.imshow(word_cloud)
plt.xticks([]) # 去掉横坐标
plt.yticks([]) # 去掉纵坐标
plt.tight_layout()
plt.show()
在运行完上述代码后,便可以生成一个自定义形状的词云图,如图6-4(b)所示。
在上述代码中,第3~4行用来打开一张图片,并同时转换为一个矩阵,第6行在实例化类WordCloud
时需要将这个矩阵赋值到mask
参数。这样便能够生成自定义样式的词云图。这里需要注意的一个地方就是,选择的这张图片的背景一定是纯白色的,因为WordCloud
的填充原理就是在图片的非白色区域进行填充。如果使用的是一张非白色背景的图片,则最后生成的词云图依旧是一个矩形。
6.4.3 小结
在本节中,笔者首先介绍了什么是词云图,接着介绍了如何根据得到的词频统计结果通过word cloud库生成词云图,最后还介绍了如何生成自定义形状的词云图。
总结一下,在本章中笔者首先介绍了两种在文本处理领域中常见的词袋模型,一步一步详细介绍了整个文本向量化的处理流程,接着介绍了如何使用朴素贝叶斯算法来完成中文垃圾邮件的分类任务,同时介绍了如何复用模型,包括存储模型和载入模型,然后介绍了文本处理领域中使用最为频繁的TFIDF表示方法及相应的计算过程,最后介绍了一种常见的文本可视化手段,即以词和其对应的词频为参数,通过word cloud库生成相应的词云图。